import tkinter as tk
from tkinter import ttk, filedialog, messagebox, simpledialog
import os
import sys
import pandas as pd
from file_utils import read_excel, save_excel
from data_processor import process_data
from 通用表格匹配 import TableMatcher
from 门诊日志转换 import convert_clinic_log
from 表格拆分 import split_excel_file  # 导入表格拆分功能
from PH3异地数据转换 import convert_异地_data

def create_gui():
    """创建美观的GUI界面并返回根窗口"""
    root = tk.Tk()
    root.title("表格处理工具")
    
    try:
        # 获取当前脚本所在目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        # 构建图标文件的相对路径
        icon_path = os.path.join(current_dir, "ik.ico")
        
        # 检查图标文件是否存在
        if os.path.exists(icon_path):
            root.iconbitmap(icon_path)
            print(f"成功加载图标: {icon_path}")
        else:
            print(f"警告: 图标文件未找到 - {icon_path}")
            print("请确保ik.ico文件与gui.py位于同一目录")
    except Exception as e:
        print(f"图标加载失败: {str(e)}")


    # 设置窗口大小并居中显示
    window_width = 550  # 调整窗口宽度适应2列布局
    window_height = 450  # 增加窗口高度容纳更多按钮
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    x = (screen_width - window_width) // 2
    y = (screen_height - window_height) // 2
    root.geometry(f"{window_width}x{window_height}+{x}+{y}")
    
    root.resizable(False, False)  # 固定窗口大小，避免布局错乱
    
    # 设置中文字体支持
    default_font = ("Microsoft YaHei UI", 10)
    root.option_add("*Font", default_font)
    
    # 创建样式对象
    style = ttk.Style()
    
    # 配置样式 - 现代扁平化风格
    style.configure("TFrame", background="#f0f2f5")
    style.configure("TLabel", background="#f0f2f5", foreground="#333333")
    style.configure("Header.TLabel", font=("Microsoft YaHei UI", 12, "bold"), padding=(0, 10, 0, 15))
    style.configure("Group.TLabel", font=("Microsoft YaHei UI", 10, "bold"), padding=(0, 15, 0, 5))
    
    # 配置按钮样式
    style.configure("Primary.TButton", 
                   background="#1a73e8", 
                   foreground="white",
                   padding=(10, 8),
                   font=("Microsoft YaHei UI", 10))
    style.map("Primary.TButton",
             background=[("active", "#0d5bcd"), ("disabled", "#cccccc")])
    
    style.configure("Secondary.TButton", 
                   background="#34a853", 
                   foreground="white",
                   padding=(10, 8),
                   font=("Microsoft YaHei UI", 10))
    style.map("Secondary.TButton",
             background=[("active", "#2d8e43"), ("disabled", "#cccccc")])
    
    style.configure("Accent.TButton", 
                   background="#fbbc04", 
                   foreground="black",
                   padding=(10, 8),
                   font=("Microsoft YaHei UI", 10))
    style.map("Accent.TButton",
             background=[("active", "#e5aa00"), ("disabled", "#cccccc")])
    
    # 异地数据转换按钮样式
    style.configure("异地数据.TButton", 
                   background="#ea4335", 
                   foreground="white",
                   padding=(10, 8),
                   font=("Microsoft YaHei UI", 10))
    style.map("异地数据.TButton",
             background=[("active", "#d93025"), ("disabled", "#cccccc")])
    
    # 表格拆分按钮样式
    style.configure("Split.TButton", 
                   background="#4285f4", 
                   foreground="white",
                   padding=(10, 8),
                   font=("Microsoft YaHei UI", 10))
    style.map("Split.TButton",
             background=[("active", "#3367d6"), ("disabled", "#cccccc")])
    
    # 配置输入框样式
    style.configure("TEntry", 
                   fieldbackground="white",
                   padding=5,
                   borderwidth=1,  
                   relief="solid")
    
    # 主框架
    main_frame = ttk.Frame(root, style="TFrame")
    main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
    
    # 标题
    ttk.Label(main_frame, text="表格处理工具", style="Header.TLabel").pack(anchor="w")
    
    # 文件选择区域
    file_frame = ttk.Frame(main_frame, style="TFrame")
    file_frame.pack(fill=tk.X, pady=(0, 20))
    
    ttk.Label(file_frame, text="Excel文件路径:").pack(anchor="w", pady=(0, 5))
    
    file_entry_frame = ttk.Frame(file_frame, style="TFrame")
    file_entry_frame.pack(fill=tk.X)
    
    file_entry = ttk.Entry(file_entry_frame)
    file_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
    
    def select_file():
        """选择Excel文件并显示路径"""
        file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")])
        if file_path:
            file_entry.delete(0, tk.END)
            file_entry.insert(0, file_path)
    
    browse_btn = ttk.Button(file_entry_frame, text="浏览", command=select_file, width=8)
    browse_btn.pack(side=tk.RIGHT, padx=(10, 0))
    
    # 功能按钮区域
    ttk.Label(main_frame, text="数据处理功能", style="Group.TLabel").pack(anchor="w")
    
    # 按钮容器 - 使用网格布局实现2列等宽布局
    button_frame = ttk.Frame(main_frame, style="TFrame")
    button_frame.pack(fill=tk.X, pady=(0, 15))
    
    # 设置网格权重，使两列等宽
    button_frame.columnconfigure(0, weight=1)
    button_frame.columnconfigure(1, weight=1)
    
    btn_width = 15  # 统一按钮宽度
    btn_pad = 8     # 按钮间距
    
    # 第一行按钮
    ttk.Button(button_frame, text="PH3处理数据", command=lambda: process_ph3_data(file_entry), 
              style="Secondary.TButton", width=btn_width).grid(row=0, column=0, padx=btn_pad, pady=btn_pad, sticky="ew")
    ttk.Button(button_frame, text="PH2通用表格匹配", command=lambda: process_table_matching(file_entry), 
              style="Primary.TButton", width=btn_width).grid(row=0, column=1, padx=btn_pad, pady=btn_pad, sticky="ew")
    
    # 第二行按钮
    ttk.Button(button_frame, text="PH2门诊日志转换", command=lambda: process_clinic_log(file_entry), 
              style="Accent.TButton", width=btn_width).grid(row=1, column=0, padx=btn_pad, pady=btn_pad, sticky="ew")
    ttk.Button(button_frame, text="PH3异地数据转换", command=lambda: process_异地_data(file_entry), 
              style="异地数据.TButton", width=btn_width).grid(row=1, column=1, padx=btn_pad, pady=btn_pad, sticky="ew")
    
    # 第三行按钮 - 单独一行
    ttk.Label(main_frame, text="工具功能", style="Group.TLabel").pack(anchor="w")
    tool_button_frame = ttk.Frame(main_frame, style="TFrame")
    tool_button_frame.pack(fill=tk.X)
    tool_button_frame.columnconfigure(0, weight=1)
    
    ttk.Button(tool_button_frame, text="表格拆分", command=lambda: process_table_split(file_entry, root), 
              style="Split.TButton", width=btn_width).grid(row=0, column=0, padx=btn_pad, pady=btn_pad)
    
    # 状态标签
    status_var = tk.StringVar(value="请选择Excel文件并点击相应功能按钮")
    status_label = ttk.Label(main_frame, textvariable=status_var, foreground="#666666", style="TLabel", wraplength=580)
    status_label.pack(anchor="w", pady=(20, 0))
    
    # 底部版权信息
    ttk.Label(main_frame, text="© maoge - 版本 1.0", 
             font=("Microsoft YaHei UI", 8), foreground="#999999").pack(anchor="e", side=tk.BOTTOM)
    
    # 处理PH3数据函数 (保持不变)
    def process_ph3_data(entry):
        """处理PH3数据按钮点击事件"""
        file_path = entry.get()
        if not file_path:
            messagebox.showerror("错误", "请选择Excel文件")
            return
            
        try:
            status_var.set("正在处理PH3数据...")
            root.update()
            
            df = read_excel(file_path)
            df = process_data(df)
            
            dir_name, file_name = os.path.split(file_path);
            new_file_name = "数据清洗_" + file_name
            save_path = os.path.join(dir_name, new_file_name)
            
            save_excel(df, save_path)
            status_var.set("PH3数据处理完成")
            
            messagebox.showinfo("成功", f"PH3数据处理完成，已保存至:\n{save_path}")
            try:
                os.startfile(os.path.dirname(save_path))
            except Exception as e:
                messagebox.showwarning("提示", f"文件已保存，但打开文件夹失败:\n{str(e)}")
        except Exception as e:
            status_var.set("处理PH3数据时出错") 
            messagebox.showerror("错误", f"处理PH3数据时出错:\n{str(e)}")
    
    # 通用表格匹配工具处理函数 (保持不变)
    def process_table_matching(entry):
        """通用表格匹配工具按钮点击事件"""
        file_path = entry.get()
        if not file_path:
            messagebox.showerror("错误", "请选择Excel文件")
            return
            
        try:
            status_var.set("正在进行通用表格匹配...")
            root.update()
            
            config_path = os.path.abspath("config.json")
            table_matcher = TableMatcher(config_path)
            
            if table_matcher.target_df is None:
                status_var.set("目标模板表格加载失败")
                messagebox.showerror("错误", "目标模板表格加载失败，请检查config.json配置")
                return
                
            if not table_matcher.load_source_table(file_path):
                status_var.set("加载待导入表格失败")
                messagebox.showerror("错误", "加载待导入表格失败")
                return
                
            dir_name, file_name = os.path.split(file_path)
            new_file_name = "表格匹配_" + file_name
            save_path = os.path.join(dir_name, new_file_name)
            
            result_df = table_matcher.generate_new_table(save_path)
            if result_df is not None:
                status_var.set("通用表格匹配完成") 
                messagebox.showinfo("成功", f"通用表格匹配完成\n已保存至:\n{save_path}")
                
                try:
                    os.startfile(os.path.dirname(save_path))
                except Exception as e:
                    messagebox.showwarning("提示", f"文件已保存，但打开文件夹失败:\n{str(e)}")
            else: 
                status_var.set("表格匹配失败")
                messagebox.showerror("错误", "表格匹配失败")
        except Exception as e:
            status_var.set("通用表格匹配时出错")
            messagebox.showerror("错误", f"通用表格匹配时出错:\n{str(e)}")
    
    # 门诊日志转换处理函数 (保持不变)
    def process_clinic_log(entry):
        """门诊日志转换按钮点击事件"""
        file_path = entry.get()
        if not file_path:
            messagebox.showerror("错误", "请选择Excel文件")
            return
            
        try:
            status_var.set("正在进行门诊日志转换...")
            root.update()
            
            dir_name, file_name = os.path.split(file_path)
            new_file_name = "门诊日志_" + file_name
            save_path = os.path.join(dir_name, new_file_name)
            
            success = convert_clinic_log(file_path, save_path)
            if success: 
                status_var.set("门诊日志转换完成")
                messagebox.showinfo("成功", f"门诊日志转换完成\n已保存至:\n{save_path}")
                
                try:
                    os.startfile(os.path.dirname(save_path))
                except Exception as e:
                    messagebox.showwarning("提示", f"文件已保存，但打开文件夹失败:\n{str(e)}")
            else:
                status_var.set("门诊日志转换失败")
                messagebox.showerror("错误", "门诊日志转换失败，请检查目标模板是否存在")
        except Exception as e:
            status_var.set("处理门诊日志时出错")
            messagebox.showerror("错误", f"处理门诊日志时出错:\n{str(e)}")
    
    # 异地数据转换处理函数 (保持不变)
    def process_异地_data(entry):
        """异地数据转换按钮点击事件"""
        file_path = entry.get()
        if not file_path:
            messagebox.showerror("错误", "请选择Excel文件")
            return
            
        try:
            status_var.set("正在进行异地数据转换...")
            root.update()
            
            # 调用异地数据转换函数
            success = convert_异地_data(file_path)
            
            if success:
                status_var.set("异地数据转换完成")
                messagebox.showinfo("成功转换", f"异地数据转换完成\n已保存至源文件目录")
                
                try:
                    os.startfile(os.path.dirname(file_path))
                except Exception as e:
                    messagebox.showwarning("提示", f"文件已保存，但打开文件夹失败:\n{str(e)}")
            else:
                status_var.set("异地数据转换失败")
                messagebox.showerror("错误", f"异地数据转换失败，请检查目标模板是否存在")
        except Exception as e:
            status_var.set("处理异地数据时出错")
            messagebox.showerror("错误", f"处理异地数据出错:\n{str(e)}")
    
    # 表格拆分处理函数 (保持不变)
    def process_table_split(entry, parent_window):
        """表格拆分按钮点击事件"""
        file_path = entry.get()
        if not file_path:
            messagebox.showerror("错误", "请选择Excel文件")
            return
            
        try:
            # 弹出输入对话框获取拆分条数
            split_size = simpledialog.askinteger(
                "输入拆分条数", 
                "请输入表格拆分条数:",
                parent=parent_window,
                minvalue=1,
                initialvalue=500  # 默认值500
            )
            
            # 用户取消输入
            if split_size is None:
                status_var.set("表格拆分已取消")
                return
                
            status_var.set("正在进行表格拆分...")
            root.update()
            
            # 调用表格拆分功能
            success, message, num_files = split_excel_file(file_path, split_size)
            
            if success:
                status_var.set("表格拆分完成")
                messagebox.showinfo("成功", message)
                
                try:
                    os.startfile(os.path.dirname(file_path))
                except Exception as e:
                    messagebox.showwarning("提示", f"文件已保存，但打开文件夹失败:\n{str(e)}")
            else:
                status_var.set("表格拆分失败")
                messagebox.showerror("错误", message)
        except Exception as e:
            status_var.set("表格拆分时出错")
            messagebox.showerror("错误", f"表格拆分时出错:\n{str(e)}")
    
    return root

def run_gui():
    """运行GUI应用"""
    if sys.platform != "win32":
        print("错误: 本程序仅支持Windows操作系统！")
        sys.exit(1)
        
    root = create_gui()
    root.mainloop()

if __name__ == "__main__":
    run_gui()